﻿// 麻省理工学院许可证
//
// 版权所有 (c) 2023-2025 缄默 联系电话/18521355630 
//
// 特此免费授予获得本软件的任何人以处理本软件的权利，但须遵守以下条件：在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他责任负责，无论是因合同、侵权或其他方式引起的，与软件或其使用或其他交易有关。

using Newtonsoft.Json.Linq;

namespace LvcChong.DB.Options
{
    public class AppsettingsProvider
    {
        public string OptionPath { get; set; } = "appSettings.json";

        private JObject? _metadataJObject = null;

        internal JObject? MetadataJObject
        {
            get => _metadataJObject;
            set => _metadataJObject = value;
        }

        public AppsettingsProvider()
        {
            if (!System.IO.File.Exists(OptionPath)) throw new Exception("没有找到配置文件");

            try
            {
                var appSettings = System.IO.File.ReadAllText(OptionPath);
                var desConn = DESHelper.DesDecrypt(appSettings);
                _metadataJObject = (JObject?)Newtonsoft.Json.JsonConvert.DeserializeObject(desConn);
            }
            catch
            {
                throw new Exception("配置文件格式错误");
            }
        }

        public AppsettingsProvider(string jsonMetadata)
        {
            _metadataJObject = (JObject?)Newtonsoft.Json.JsonConvert.DeserializeObject(jsonMetadata);
        }

        public T? GetOption<T>() where T : class
        {
            if (_metadataJObject == null!) return default(T);

            if (!_metadataJObject.ContainsKey(typeof(T).Name)) return default(T);

            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(_metadataJObject[typeof(T).Name].ToString());
        }

        public List<T>? GetOptions<T>(string nodeName) where T : class
        {
            if (_metadataJObject == null!) return default;

            if (!_metadataJObject.ContainsKey(nodeName)) return default;

            return Newtonsoft.Json.JsonConvert.DeserializeObject<List<T>?>(_metadataJObject[nodeName].ToString());
        }

        public void LoadOptions(string json)
        {
            _metadataJObject = (JObject?)Newtonsoft.Json.JsonConvert.DeserializeObject(json);
        }

        public bool SetOption<T>(string key, T value) where T : class
        {
            if (value == null) return false;
            if (_metadataJObject == null!) return false;
            if (!_metadataJObject.ContainsKey(key)) return false;

            try
            {
                if (value.GetType() == typeof(string))
                    _metadataJObject[key] = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(value.ToString()!);
                else _metadataJObject[key] = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(Newtonsoft.Json.JsonConvert.SerializeObject(value));
                return true;
            }
            catch (Exception ex)
            {
                NLogHelper.Error(ex, ex.Message);
                return false;
            }
        }

        public bool Save()
        {
            try
            {
                //System.IO.File.WriteAllText(path, Utility.Security.DESHelper.DesEncrypt(settingJson, CONNECTION_STRING_KEY, CONNECTION_STRING_IV));
                System.IO.File.WriteAllText(OptionPath, Newtonsoft.Json.JsonConvert.SerializeObject(_metadataJObject));
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}